﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GraphAlgorithm
{
	/// <summary>
	/// A gráf egy csomópontja.
	/// </summary>
	internal class Vertex
	{
		/// <summary>
		/// A csomópont azonosítója.
		/// </summary>
		private int id;

		/// <summary>
		/// A csomópont színe.
		/// </summary>
		private int color;

		/// <summary>
		/// A csomópont súlya.
		/// </summary>
		private int w;

		/// <summary>
		/// Azon színek listája, amelyeket a csomópont felvehet.
		/// </summary>
		private List<Graph.Color> availableColors = new List<Graph.Color>();

		/// <summary>
		/// A csomópontból kiinduló éllista.
		/// </summary>
		private List<int> edges = new List<int>();

		/// <summary>
		/// Konstruktor.
		/// </summary>
		/// <param name="id">A csomópont azonosítója.</param>
		internal Vertex( int id )
		{
			this.id = id;
			this.color = -1;
			this.w = 1;
		}

		/// <summary>
		/// Konstruktor.
		/// </summary>
		/// <param name="id">A csomópont azonosítója.</param>
		/// <param name="w">A csomópnt súlya.</param>
		internal Vertex( int id, int w )
		{
			this.id = id;
			this.color = -1;
			this.w = w;
		}

		/// <summary>
		/// Új szín felvétele a csomópont színlistájába.
		/// </summary>
		/// <param name="c">A szín.</param>
		internal void AddColor( Graph.Color c )
		{
			availableColors.Add( c );
		}

		internal void AddOnlyPossibleColor( Graph.Color c )
		{
			availableColors.Clear();
			availableColors.Add( c );
		}

		/// <summary>
		/// A színlista egy elemének lekérdezése.
		/// </summary>
		/// <param name="i">Az elem indexe.</param>
		/// <returns>A színlista i. eleme.</returns>
		internal Graph.Color GetAvailableColor( int i )
		{
			return availableColors[i];
		}

		/// <summary>
		/// A csomópont azonosítója.
		/// </summary>
		internal int ID
		{
			get { return id; }
		}

		/// <summary>
		/// A csomópont színe.
		/// </summary>
		internal int Color
		{
			get { return color; }
			set { color = value; }
		}


		/// <summary>
		/// A csomópont színlistája.
		/// </summary>
		internal List<int> AvailableColors
		{
			get
			{
				List<int> retVal = new List<int>();
				foreach( Graph.Color c in availableColors )
				{
					retVal.Add( c.ID );
				}
				return retVal;
			}
		}

		/// <summary>
		/// A csomópont éllistája.
		/// </summary>
		internal List<int> Edges
		{
			get { return edges; }
			set { edges = value; }
		}

		/// <summary>
		/// A csomópont súlya.
		/// </summary>
		internal int W
		{
			get { return w; }
			set { w = value; }
		}

		/// <summary>
		/// A csomópont kiírása.
		/// </summary>
		internal void Print()
		{
			Console.WriteLine( "Vertex ID: " + id );
			Console.WriteLine( "Vertex weight: " + w );
			Console.Write( "Available colors: " );
			foreach( Graph.Color c in availableColors )
			{
				Console.Write( c.ID + "(" + String.Format( "{0:F2}", c.W ) + ")" + " " );
			}
			Console.WriteLine( "" );
			Console.WriteLine( "Current color: " + color );

			Console.Write( "Edges: " );
			foreach( int e in edges )
			{
				Console.Write( e + " " );
			}
			Console.WriteLine( "" );
		}

	}
}
